--***********************************************************
--**                    THE INDIE STONE                    **
--**				  Author: turbotutone				   **
--***********************************************************
require "RadioCom/RadioWindowModules/RWMPanel"

RWMChannelTV = RWMPanel:derive("RWMChannelTV");

local FONT_HGT_SMALL = getTextManager():getFontHeight(UIFont.Small)

function RWMChannelTV:initialise()
    ISPanel.initialise(self)
end

function RWMChannelTV:createChildren()
    local y = 0;
    self.comboBox = ISComboBox:new (10, 5, self.width-20, FONT_HGT_SMALL + 2 * 2, self, RWMChannelTV.comboChange)
    self.comboBox:initialise();
    self:addChild(self.comboBox);

    y = self.comboBox:getY() + self.comboBox:getHeight();

    self.tuneInButton = ISButton:new(10, y+5, self.width-20, FONT_HGT_SMALL + 1 * 2, getText("IGUI_RadioTuneIn"),self, RWMChannelTV.doTuneInButton);
    self.tuneInButton:initialise();
    self.tuneInButton.backgroundColor = {r=0, g=0, b=0, a=0.0};
    self.tuneInButton.backgroundColorMouseOver = {r=1.0, g=1.0, b=1.0, a=0.1};
    self.tuneInButton.borderColor = {r=1.0, g=1.0, b=1.0, a=0.3};
    self:addChild(self.tuneInButton);

    y = self.tuneInButton:getY() + self.tuneInButton:getHeight() + 5;

    self:setHeight( y );
end

function RWMChannelTV:isValidPresets()
    if self.presets and self.comboBox.selected > 0 and self.comboBox.selected-1 < self.presets:size() then
        return true;
    end
end

function RWMChannelTV:comboChange()
    if self:isValidPresets() then
        self.selectedPreset = self.presets:get( self.comboBox.selected-1 );
    end
end

function RWMChannelTV:doTuneInButton()
    if self:isValidPresets() and self.player and self.device then
        local p = self.presets:get( self.comboBox.selected-1 );
        if self:doWalkTo() then
            ISTimedActionQueue.add(ISRadioAction:new("SetChannel",self.player, self.device, p:getFrequency() ));
        end
    end
end

function RWMChannelTV:addComboOption( _freq, _name )
    local s = _name;
    if getTextManager():MeasureStringX(UIFont.Small, s) > self.comboBox:getWidth() then
        local ss = "";
        for i = 1, #s do
            ss = ss .. s:sub(i,i);
            if getTextManager():MeasureStringX(UIFont.Small, ss) > self.comboBox:getWidth() - 45 then
                ss = ss .. "...";
                break;
            end
        end
        s = ss;
    end
    self.comboBox:addOption(s);
end

function RWMChannelTV:readPresets( _selected )
    self.comboBox.options = {};
    self.comboBox.selected = 0;
    if self.deviceData and self.deviceData:getDevicePresets() and self.deviceData:getDevicePresets():getPresets() then
        self.presets = self.deviceData:getDevicePresets():getPresets();
        for i = 0, self.presets:size()-1 do
            local p = self.presets:get(i);
            self:addComboOption(p:getFrequency(), p:getName());
            if not _selected and p:getFrequency() == self.deviceData:getChannel() then
                self.comboBox.selected = i+1;
            end
        end
        if _selected and _selected > 0 and _selected <= self.presets:size() then
            self.comboBox.selected = _selected;
        end
    end
end

function RWMChannelTV:clear()
    RWMPanel.clear(self);
    self.presets = nil;
    self.comboBox.options = {};
    self.comboBox.selected = 0;
end

function RWMChannelTV:readFromObject( _player, _deviceObject, _deviceData, _deviceType )
    if _deviceData:getIsTelevision()==false then
        return false;
    end
    RWMPanel.readFromObject(self, _player, _deviceObject, _deviceData, _deviceType );
    self:readPresets();
    return true;
end

function RWMChannelTV:prerender()
    ISPanel.prerender(self);
end

function RWMChannelTV:update()
    ISPanel.update(self);

    if self.comboBox and self.comboBox.expanded == true and self.lastModeExpanded == false then
        local a,b = self.comboBox:getY()+self.comboBox:getHeight()+5, self.tuneInButton:getY()+self.tuneInButton:getHeight()+5;
        self:setHeight( a > b and a or b);
        --self:setHeight(self.comboBox:getY()+self.comboBox:getHeight()+5);
        --print("height: ",( a > b and a or b) );
        if self.parent then
            self.parent:calculateHeights();
        else
            print("no parent")
        end
        self.lastModeExpanded = true;
    elseif self.comboBox and self.comboBox.expanded == false and self.lastModeExpanded == true then
        self:setHeight(self.tuneInButton:getY()+self.tuneInButton:getHeight()+5);
        if self.parent then
            self.parent:calculateHeights();
        end
        self.lastModeExpanded = false;
    end

    if self.deviceData and self.deviceData:getIsTurnedOn() then
        self.tuneInButton:setEnable(true);
    else
        self.tuneInButton:setEnable(false);
    end
end

function RWMChannelTV:render()
    ISPanel.render(self);
    if self.focusElement then
        local x,y,w,h = self.focusElement:getX(),self.focusElement:getY(),self.focusElement:getWidth(),self.focusElement:getHeight();
        self:drawRectBorder(x, y, w, h, 0.4, 0.2, 1.0, 1.0);
        self:drawRectBorder(x+1, y+1, w-2, h-2, 0.4, 0.2, 1.0, 1.0);
    end
end

function RWMChannelTV:setParent( _parent )
    self.parent = _parent;
end

function RWMChannelTV:getParent()
    return self.parent;
end

function RWMChannelTV:onJoypadDown(button)
    if button == Joypad.AButton then
        if self.focusElement then --and self.focusElement.isCombobox then
            self.focusElement:forceClick();
            self.focusElement:setJoypadFocused(false);
            self.focusElement = nil;
        else
            if self.deviceData:getIsTurnedOn() then
                self:doTuneInButton()
            end
        end
    elseif button == Joypad.RBumper then
        if self.focusElement == self.comboBox then
            self.focusElement:setJoypadFocused(false);
            self.focusElement = nil;
        else
            self.focusElement = self.comboBox;
            self.focusElement.expanded = true;
            self.focusElement:showPopup();
            self.focusElement:setJoypadFocused(true);
        end
    elseif button == Joypad.LBumper then
        if self.focusElement then
            self.focusElement:setJoypadFocused(false);
            self.focusElement = nil;
        end
    end
    return false, true; --overrides RBumper
end

function RWMChannelTV:getAPrompt()
    if self.focusElement then
        return getText("IGUI_RadioSelectChannel");
    else
        if self.deviceData:getIsTurnedOn() then
            return getText("IGUI_RadioTuneIn");
        end
    end
    return nil;
end
function RWMChannelTV:getBPrompt()
    return nil;
end
function RWMChannelTV:getXPrompt()
    return nil;
end
function RWMChannelTV:getYPrompt()
    return nil;
end
function RWMChannelTV:getRBPrompt()
    if self.focusElement == self.comboBox then
        return getText("IGUI_RadioDeselectChannelList");
    else
        return getText("IGUI_RadioSelectChannelList");
    end
end


function RWMChannelTV:new (x, y, width, height )
    local o = RWMPanel:new(x, y, width, height);
    setmetatable(o, self)
    self.__index = self
    o.x = x;
    o.y = y;
    o.background = true;
    o.backgroundColor = {r=0, g=0, b=0, a=0.0};
    o.borderColor = {r=0.4, g=0.4, b=0.4, a=1};
    o.width = width;
    o.height = height;
    o.anchorLeft = true;
    o.anchorRight = false;
    o.anchorTop = true;
    o.anchorBottom = false;
    o.fontheight = getTextManager():MeasureStringY(UIFont.Small, "AbdfghijklpqtyZ")+2;
    o.parent = nil;
    o.lastModeExpanded = false;
    return o
end

